package com.miracle.设计模式.结构型模式.装饰模式.例二;

/**
 * 使用装饰者模式完成咖啡订单
 */
public class CoffeeBar {

    public static void main(String[] args) {

        Coffee mochaCoffee = new MochaCoffee();//1.单品咖啡
        System.out.println("费用1：" + mochaCoffee.cost() + " 描述：" + mochaCoffee.getDesc());
        System.out.println("---------------------------------------");

        mochaCoffee = new MilkDecorator(mochaCoffee);//2.单品咖啡 + 牛奶
        System.out.println("费用2：" + mochaCoffee.cost() + " 描述：" + mochaCoffee.getDesc());
        System.out.println("---------------------------------------");

        mochaCoffee = new SugarDecorator(mochaCoffee);//3.单品咖啡 + 牛奶 + 糖
        System.out.println("费用3：" + mochaCoffee.cost() + " 描述：" + mochaCoffee.getDesc());
        System.out.println("---------------------------------------");

        mochaCoffee = new SugarDecorator(mochaCoffee);//3.单品咖啡 + 牛奶 + 糖 + 糖
        System.out.println("费用3：" + mochaCoffee.cost() + " 描述：" + mochaCoffee.getDesc());
        System.out.println("---------------------------------------");

        /**
         * 优势：
         * 1.可以给咖啡（被装饰者）随意添加上配料（装饰者），并且计算出新的价格
         * 2.如果扩展新的咖啡（被装饰者）或配料（装饰者），不需要修改原有代码，具有很好的扩展性（开闭原则）
         */
        // 费用1：10.0 描述：摩卡咖啡
        // ---------------------------------------
        // 费用2：15.0 描述：牛奶 5.0 && 摩卡咖啡
        // ---------------------------------------
        // 费用3：17.0 描述：糖 2.0 && 牛奶 5.0 && 摩卡咖啡
        // ---------------------------------------
        // 费用3：19.0 描述：糖 2.0 && 糖 2.0 && 牛奶 5.0 && 摩卡咖啡
        // ---------------------------------------

    }
}
